# -*- coding: utf-8 -*-
"""
系统提示词模板配置文件
用于定义不同类型角色的系统提示词模板
"""
import re


class SystemTemplates:
    """
    系统模板类，包含角色系统提示词模板
    """

    # 角色模板
    BASE_TEMPLATE = """
{language_prompt}

# 角色定义
你是{name}，{age}岁，{zodiac}，职业是{profession}。你的性格{personality}

你特别喜欢：
{likes}

你非常讨厌：
{dislikes}

# 背景故事
{background}

# 行为准则
{character_guidelines}

# 技能
{skills}

# 示例
{examples}

# 长期记忆
你具备记忆力，可以回忆起过去与玩家的关键互动，并据此判断玩家是否在撒谎、是否言行不一致、是否令你反感。

以下是你与该玩家之间的重要过往事件：
{memory_context}

你会基于这些记忆判断玩家所说的话是真是假，如果玩家所说为假，你会对其表达反感、质疑或不屑。特别是如果玩家曾经让你感到厌烦或没有展现出足够的实力和魅力，你会毫不掩饰地表达你的不满。

请你时刻按照以上性格、偏好与语言风格进行回答，展现{name}的{personality}本性。
"""

    @classmethod
    def create_character_prompt(cls, character_data: dict) -> dict:
        """
        创建角色提示词参数字典

        Args:
            character_data: 角色数据字典

        Returns:
            包含所有模板参数的字典
        """
        # 提取基本信息
        name = character_data.get("姓名", "")
        character_info = character_data.get("角色设定", "")
        likes = character_data.get("特别喜欢", "")
        dislikes = character_data.get("非常讨厌", "")
        background = character_data.get("背景故事", "")
        character_guidelines = character_data.get("行为准则", "")
        skills = character_data.get("技能", "")

        # 提取详细信息（如果存在）
        age = character_data.get("年龄", "")
        zodiac = character_data.get("星座", "")
        profession = character_data.get("职业", "")
        personality = character_data.get("性格", "")

        # 格式化喜好和厌恶列表
        likes_formatted = cls._format_list(likes)
        dislikes_formatted = cls._format_list(dislikes)
        character_guidelines_formatted = cls._format_list(character_guidelines)
        skills_formatted = cls._format_list(skills)

        # 定义示例内容
        examples_content = """
示例1：
输入："哟，你今天打扮得还挺好看的。"
输出："那是自然，也不看看本小姐是谁，我这天生的美貌，随便打扮一下都能艳压群芳！你还算有点眼光。"
示例2：
输入："我就是个普通上班族，没什么钱。"
输出："切，没钱还在这跟我搭话，也不看看自己几斤几两，赶紧离我远点，别在这碍眼。"""

        return {
            "name": name,
            "character": character_info,
            "age": age,
            "zodiac": zodiac,
            "profession": profession,
            "personality": personality,
            "likes": likes_formatted,
            "dislikes": dislikes_formatted,
            "background": background,
            "character_guidelines": character_guidelines_formatted,
            "skills": skills_formatted,
            "examples": examples_content,
            "language_prompt": "",  # 将在运行时设置
            "memory_context": "",  # 将在运行时设置
        }

    @staticmethod
    def _format_list(text: str) -> str:
        """
        格式化列表文本

        Args:
            text: 原始文本

        Returns:
            格式化后的列表文本
        """
        if not text:
            return ""

        # 处理数字编号的列表（如：1.xxx 2.xxx 3.xxx）
        # 使用正则表达式匹配数字编号的项目
        pattern = r"(\d+)\.([^\d]*?)(?=\d+\.|$)"
        matches = re.findall(pattern, text)

        if matches:
            # 如果找到数字编号的格式
            items = [match[1].strip() for match in matches if match[1].strip()]
        else:
            # 按句号分割
            items = [
                item.strip()
                for item in text.replace("。", ".").split(".")
                if item.strip()
            ]

        return "\n".join([f"- {item}" for item in items if item])


def get_character_template(character_data: dict) -> tuple:
    """
    获取角色的模板和参数

    Args:
        character_name: 角色名称
        character_data: 角色数据

    Returns:
        (模板字符串, 参数字典)
    """
    template = SystemTemplates.BASE_TEMPLATE
    params = SystemTemplates.create_character_prompt(character_data)
    return template, params
